package jdk6;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

import org.junit.Test;

public class CompilerAPI {

	/**
	 *	 使用ToolProvider类来获得JavaCompiler接口的一个默认实现。
	 *	ToolProvider类提供一个getSystemJavaCompiler()方法，返回JavaCompiler接口的一个实例
	 * 	使用JavaCompiler最简单的方法是直接调用run()方法，run()方法是在Tool接口中实现的
	 */
	static String javaFilePath = new File("src/jdk6/CompilerAPI.java").getAbsolutePath();
	static String classFilePath = new File("src/jdk6/").getAbsolutePath();

	@Test
	public void compiler1() {
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		int results = compiler.run(null, null, null, javaFilePath);
		System.out.println("Result code: " + results);
	}

	@Test
	public void compiler2() throws Exception {
		// 返回此平台提供的工具的类加载器。
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		// 执行
		int result = compiler.run(null, null, null, javaFilePath);
		System.out.println(result == 0 ? "成功" : "失败");
		// 类加载地址
		URL[] urls = new URL[] { new URL("file:/" + classFilePath + "/") };
		// 类加载器
		URLClassLoader loader = URLClassLoader.newInstance(urls);
		Class<?> clazz = loader.loadClass("jdk6.CompilerAPI");
		Method method = clazz.getMethod("m1");
		// 通过Object把数组转化为参数
		Object o = method.invoke(clazz.getDeclaredConstructor().newInstance());
		System.out.println(o);
	}

	// 测试用方法
	public Object m1() {
		System.out.println("m1 方法执行了");
		return 1314;
	}
}
